﻿package br.gov.bcb.wicket.stuff.util;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.IBehavior;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.model.IModel;

/**
 * Utilitário pra os attribute modifier customizados pelo BcWicketStuff.
 * 
 */
public class AttributeModifierUtil {

    /**
     * Define o valor de um atributo de um componente Wicket, usando um SimpleAttributeModifier
     * excluindo outro
     * 
     * @param componente Componente ao qual o attributemodifier foi adicionado.
     * @param nomeAtributo Nome do atributo.
     * @param valor Valor a ser definido no atributo.
     */
    public static void setAtributo(Component componente, String nomeAtributo, String valor) {

        removerAtributo(componente, nomeAtributo);
        SimpleAttributeModifier attributeModifier = new SimpleAttributeModifier(nomeAtributo, valor);
        componente.add(attributeModifier);
    }

    /**
     * Define o valor de um atributo de um componente Wicket, usando um SimpleAttributeModifier
     * excluindo outro
     * 
     * @param componente Componente ao qual o attributemodifier foi adicionado.
     * @param nomeAtributo Nome do atributo.
     * @param valor Valor a ser definido no atributo.
     * @param <M> Tipo do model.
     */
    public static <M extends IModel<?>> void setAtributo(Component componente, String nomeAtributo, M valor) {

        removerAtributo(componente, nomeAtributo);
        AttributeModifier attributeModifier = new AttributeModifier(nomeAtributo, true, valor);
        componente.add(attributeModifier);
    }

    /**
     * Remove um
     * 
     * @param componente
     * @param nomeAtributo
     */

    public static void removerAtributo(Component componente, String nomeAtributo) {

        List<IBehavior> list = new ArrayList<IBehavior>(componente.getBehaviors());

        for (IBehavior behavior : list) {
            if (behavior.getClass().isAssignableFrom(SimpleAttributeModifier.class)) {
                SimpleAttributeModifier attributeModifier = (SimpleAttributeModifier) behavior;
                if (StringUtils.equalsIgnoreCase(nomeAtributo, attributeModifier.getAttribute())) {
                    componente.remove(attributeModifier);
                }
            } else if (behavior.getClass().isAssignableFrom(AttributeModifier.class)) {
                AttributeModifier attributeModifier = (AttributeModifier) behavior;
                if (StringUtils.equalsIgnoreCase(nomeAtributo, attributeModifier.getAttribute())) {
                    componente.remove(attributeModifier);
                }
            }
        }
    }

}
